<?php
/**
 * Created by PhpStorm.
 * User: Sunqj
 * Date: 2018/1/4
 * Time: 上午10:23
 */
namespace Admin\Controller;

use JPush\Client;
use JPush\Exceptions\APIConnectionException;
use JPush\Exceptions\APIRequestException;
use Think\Controller;
use Think\Exception;
use Think\Model;

class AwardController extends Controller
{
    public function grant()
    {

        // 开启事务
        M()->startTrans();

        try
        {
            // 第一步：导入员工工资
            $this->importAchievement();

            // 第二步：根据导入的工资进行结算奖金
            $this->settleAchievement();

            // 提交事务
            M()->commit();
        }
        catch (Exception $exception)
        {
            // 回滚操作
            M()->rollback();
        }
    }


    private function importAchievement()
    {
        // 打开工资记录文件
        $file = fopen('C:\INSERT.log', 'r');

        $number = $this->getLastSeek();

        // 根据上次读取的位置，对文件进行定位
        fseek($file, $number);

        // 存储SQL语句
        $sqlArray = [];

        // 输出文本中所有的行，直到文件结束为止。
        while(! feof($file))
        {
            // 逐行读取数据
            $line = trim(fgets($file));

            // 如果为空行，则不做任何处理
            if (empty($line))
            {
                continue;
            }

            // 逐行读取SQL语句
            $sqlArray[]= $line;

            // SQL语句每次最多执行500条
            if (count($sqlArray) >= 500)
            {
                // 执行SQL语句
                (new Model())->execute(join('', $sqlArray));

                // 清空存储的语句
                $sqlArray = [];
            }

        }

        //var_dump(join('', $sqlArray));
        if (!empty($sqlArray))
        {
            (new Model())->execute(join('', $sqlArray));
            // 清空存储的语句
            $sqlArray = [];
        }

        $x = ftell($file);
        // 存储当前读取到的位置
        $this->setLastSeek($x);

        // 关闭文件
        fclose($file);
    }

    // 上次读取的位置
    private function getLastSeek()
    {
        // 记录文件
        $file = DATA_PATH . 'achievement.txt';

        // 获取文件内容
        $seek = file_get_contents($file);

        // 返回上次读取的位置
        return empty($seek) ? 0 : intval($seek);
    }

    // 更新上次读取的位置
    private function setLastSeek($seek)
    {
        // 记录文件
        $file = DATA_PATH . 'achievement.txt';

        // 设置文件内容
        file_put_contents($file, $seek);
    }

    // 结算工资
    private function settleAchievement()
    {

        // 结算日期
        $date = strtotime(I('date')) > 0 ? date('Y-m-d', strtotime(I('date'))) : date('Y-m-d');
        //echo $date;
        // 开始时间
        $startTime = date('Y-m-d 12:00:00', strtotime('-1 day', strtotime($date)));
        //echo $startTime;
        //print_r($startTime);
        // 结束时间
        $endTime = $date . ' 12:00:00';
        //echo $endTime;
        //print_r($endTime);die;
        // 奖金参数
        $ratio = M('ratio')->find();
        $params = [
            'rate_1' => floatval($ratio['agent_ratio']),
            'rate_2' => floatval($ratio['upper_agent_ratio']),
            'rate_3' => floatval($ratio['upper_upper_agent_ratio'])
        ];

        // 获取所有需要结算的工资
        do
        {
            // 获取满足条件的数据
            $list = M('achievement', 'ims_')
                ->where([
                    'status' => 0,
                    //'createtime' => ['between', [$startTime, $endTime]]
                    'createtime' => ['lt',$endTime]
                ])
                ->limit(5)
                ->select();
            //var_dump($list);
            // 遍历数据发放奖金
            foreach ($list as $item)
            {
                // 发放奖金
                $this->grantByAchievement($item, $params);

                // 更新状态
                M('achievement', 'ims_')->where(['hid'=>$item['hid']])->save(['status'=>1]);
            }
        }
        while($list);
    }

    // 通过工资进行发放
    private function grantByAchievement($achievement, $params)
    {
        //M('register')->where('id > 0')->save(array('commission'=>0));
        // 获取员工数据
        $user = M('register')
            ->where([
                'bind_id' => $achievement['jsmc'],
                'bind_did' => $achievement['jg_dm']
            ])
            ->find();
        //var_dump($user);
        // 会员不存在则不执行任何操作
        if (empty($user))
        {
            return;
        }

        // 不存在上级会员
        if ($user['agent_id'] == 0)
        {
            return;
        }
        // 仅存在上级会员
        elseif ($user['upper_agent_id'] == 0)
        {
            // 上级会员
            $parent = M('register')->where(['id'=>$user['agent_id']])->find();

            if ($parent)
            {
                // 奖金数目
                $rate = $params['rate_1'];
                //echo $rate;
                // 发放佣金
                $this->grantCommission($user, $parent, $achievement, $rate, 1);

            }
        }
        // 仅存在上上级，不存在上上上级
        elseif ($user['upper_upper_agent_id'] == 0)
        {
            // 上级会员
            $parent = M('register')->where(['id'=>$user['agent_id']])->find();

            // 如果上级会员不存在，则不做任何处理
            if (empty($parent))
            {
                return;
            }

            // 上级会员工资奖金
            $rate = $params['rate_1'];

            // 发放奖金金
            $this->grantCommission($user, $parent, $achievement, $rate, 1);

            // 上上级会员
            $grandpa = M('register')->where(['id'=>$user['upper_agent_id']])->find();

            if ($grandpa)
            {
                // 佣金比例
                $rate = $params['rate_2'];

                // 发放佣金
                $this->grantCommission($user, $grandpa, $achievement, $rate, 2);
            }

        }
        // 存在上上上级
        else
        {
            // 上级会员
            $parent = M('register')->where(['id'=>$user['agent_id']])->find();

            // 如果上级会员不存在，则不做任何处理
            if (empty($parent))
            {
                return;
            }

            // 佣金比例
            $rate = $params['rate_1'];

            // 发放佣金
            $this->grantCommission($user, $parent, $achievement, $rate, 1);

            // 上上级会员
            $grandpa = M('register')->where(['id'=>$user['upper_agent_id']])->find();

            if ($grandpa)
            {
                // 佣金比例
                $rate = $params['rate_2'];

                // 发放佣金
                $this->grantCommission($user, $grandpa, $achievement, $rate, 2);
            }
            //上上级会员
            $greatpa = M('register')->where(['id'=>$user['upper_upper_agent_id']])->find();

            if ($greatpa)
            {
                // 佣金比例
                $rate = $params['rate_3'];

                // 发放佣金
                $this->grantCommission($user, $greatpa, $achievement, $rate, 3);
            }
        }

        // 放入资金池
        //$this->putAwardPond($user, 0.02 * $achievement['tcje']);
    }

    // 向指定的会员发放佣金
    private function grantCommission($fromUser, $toUser, $info, $rate, $level)
    {
        $commission = $rate;
        //echo $commission."<br/>";
        if ($toUser['lock'] && $info['tcje']>=45)
        {
            // 增加会员的佣金
            M('register')->where(['id'=>(int)$toUser['id']])->setInc('commissions', (float)$commission);

            //如果结算日期为当天日期，则更新昨日佣金
            $date = strtotime(I('date')) > 0 ? date('Y-m-d', strtotime(I('date'))) : date('Y-m-d');
            //echo $date."<br/>";
            //echo date('Y-m-d',strtotime($toUser['update_time']))."<br/>";

            if($date!=date('Y-m-d',strtotime($toUser['update_time'])))
            {
                //echo '113'."<br/>";
                M('register')
                    ->where(['id'=>$toUser['id']])
                    ->save(array(
                        "commission"=>0
                    ));

            }
            $datetime['update_time'] = date('Y-m-d H:i:s');
            //$datetime['update_time'] = date('Y-m-d 12:00:00', strtotime('-1 day', strtotime($date)));

            M('register')->where(['id'=>$toUser['id']])->setInc('commission', $commission);

            M('register')->where(['id'=>$toUser['id']])->save($datetime);




            // 添加工资奖金记录
            M('bonus')->add([
                'mid' => $fromUser['id'],
                'tel' => $fromUser['tel'],
                'time' => $info['createtime'],
                'TCJE' => $info['tcje'],
                'jsmc' => $info['jsmc'],
                'stime' => $date . date(' H:i:s'),
                'uid' => $toUser['id'],
                'money' => $commission,
                'remark' => $level
            ]);
            // 推送消息
            $this->push($toUser, $commission);
        }
    }

    /**
     * 把指定奖金放入资金池
     *
     * @param $user
     * @param $award
     */
//    private function putAwardPond($user, $award)
//    {
//        // 结算日期
//        $date = strtotime(I('date')) > 0 ? date('Y-m-d', strtotime(I('date'))) : date('Y-m-d');
//
//        M('commission')
//            ->add([
//                'uid' => $user['id'],
//                'tel' => $user['tel'],
//                'time' => "{$date} 12:00:00",
//                'money' => $award
//            ]);
//    }

    // 推送消息
    private function push($user, $commission){
        //echo 123;die;
        $client = new Client(C('JPUSH.APP_KEY'), C('JPUSH.MASTER_SECRET'));

        try {
            $client->push()
                ->setPlatform('android')
                ->addAlias($user['tel'])
                ->androidNotification('紫薇阁温馨提示：您昨天所得奖金'.$commission.'元', [
                    'extras' => [
                        'type' => '/index.php/home/index/commission/id/' . $user['id']
                    ]
                ])
                ->options(array(
                    'apns_production' => false,
                ))
                ->send();
        } catch (APIConnectionException $e) {
            // try something here
            //print $e;
        } catch (APIRequestException $e) {
            // try something here
            //print $e;
        }
    }
}